#include "util.hpp"
#include "config.hpp"
#include "data.hpp"
#include "hot.hpp"
#include "server.hpp"
#include <thread>

void FileUtilTest(std::string filename)
{
    // cloud::FileUtil fileutil(path);
    //  std::cout<<fileutil.FileSize()<<std::endl;
    //  std::cout<<fileutil.LassATime()<<std::endl;
    //  std::cout<<fileutil.LassMTime()<<std::endl;
    //  std::cout<<fileutil.FileName()<<std::endl;

    // //读取数据
    // cloud::FileUtil fileutil1(path);
    // std::string body;
    // fileutil1.GetContent(&body);
    // //写入数据
    // cloud::FileUtil fileutil2("./hello.txt");
    // fileutil2.SetContent(body);

    // std::string packedname = filename + ".lz";
    // cloud::FileUtil fileutil1(filename);
    // fileutil1.Compress(packedname);
    // cloud::FileUtil fileutil2(packedname);
    // fileutil2.UnCompress("./hello.txt");

    cloud::FileUtil fu(filename);
    fu.CreateDirectory();
    std::vector<std::string> array;
    fu.ScanDirectory(&array);
    for (auto &a : array)
    {
        std::cout << a << std::endl;
    }
}
void JsonUtilTest()
{
    const char *str = "小明";
    int age = 19;
    float score[] = {56.6, 48.2, 98.52};
    Json::Value root;
    root["姓名"] = str;
    root["年龄"] = age;
    root["成绩"].append(score[0]);
    root["成绩"].append(score[1]);
    root["成绩"].append(score[2]);

    std::string Json_str;
    cloud::JsonUtil::Serialize(root, &Json_str); // 序列化：将数据变成可以传输的过程
    std::cout << Json_str << std::endl;
    Json::Value Val;
    cloud::JsonUtil::UnSerialize(Json_str, &Val); // 反序列化
    std::cout << Val["姓名"].asString() << std::endl;
    std::cout << Val["年龄"].asInt() << std::endl;
    std::cout << "成绩：" << std::endl;
    for (int i = 0; i < Val["成绩"].size(); i++)
    {
        std::cout << Val["成绩"][i] << std::endl;
    }
    return;
}
void ConfigTest()
{
    cloud::Config *config = cloud::Config::GetInstance();
    if (config != nullptr)
    {
        std::cout << config->GetHotTime() << std::endl;
        std::cout << config->GetServerPort() << std::endl;
        std::cout << config->GetServerIp() << std::endl;
        std::cout << config->GetDownloadPrefix() << std::endl;
        std::cout << config->GetPackFileSuffix() << std::endl;
        std::cout << config->GetBackDir() << std::endl;
        std::cout << config->GetPackDir() << std::endl;
        std::cout << config->GetBackupFile() << std::endl;
    }
}

void DataTest(const std::string filename)
{
    // cloud::BackupInfo info;
    // info.NewBackupInfo(filename);
    // std::cout << "---------- info ---------" << std::endl;
    // std::cout << info.pack_flag << std::endl;
    // std::cout << info.fsize << std::endl;
    // std::cout << info.atime << std::endl;
    // std::cout << info.mtime << std::endl;
    // std::cout << info.real_path << std::endl;
    // std::cout << info.pack_path << std::endl;
    // std::cout << info.url_path << std::endl;
    cloud::DataManager dm;
    std::vector<cloud::BackupInfo> arry;
    std::cout << dm.GetAll(&arry) << std::endl;
    for (auto &a : arry)
    {
        std::cout << a.pack_flag << std::endl;
        std::cout << a.fsize << std::endl;
        std::cout << a.atime << std::endl;
        std::cout << a.mtime << std::endl;
        std::cout << a.real_path << std::endl;
        std::cout << a.pack_path << std::endl;
        std::cout << a.url_path << std::endl;
    }

    // std::cout << "---------- Insert and GetOneByUrl ---------" << std::endl;
    // std::cout << dm.Insert(info) << " ";
    // cloud::BackupInfo tmp;
    // std::cout << dm.GetOneByUrl("/download/bundle.h", &tmp) << std::endl;
    // std::cout << tmp.pack_flag << std::endl;
    // std::cout << tmp.fsize << std::endl;
    // std::cout << tmp.atime << std::endl;
    // std::cout << tmp.mtime << std::endl;
    // std::cout << tmp.real_path << std::endl;
    // std::cout << tmp.pack_path << std::endl;
    // std::cout << tmp.url_path << std::endl;
    // tmp.pack_flag = true;
    // std::cout << "---------- Updata and GetAll ---------" << std::endl;
    // std::cout << dm.Updata(tmp) << " ";
    // std::vector<cloud::BackupInfo> arry;
    // std::cout << dm.GetAll(&arry) << std::endl;
    // for (auto &a : arry)
    // {
    //     std::cout << a.pack_flag << std::endl;
    //     std::cout << a.fsize << std::endl;
    //     std::cout << a.atime << std::endl;
    //     std::cout << a.mtime << std::endl;
    //     std::cout << a.real_path << std::endl;
    //     std::cout << a.pack_path << std::endl;
    //     std::cout << a.url_path << std::endl;
    // }
    // std::cout << "------------ GetOneByRealpath -------------------" << std::endl;
    // std::cout << dm.GetOneByRealpath(filename, &tmp) << std::endl;
    // std::cout << tmp.pack_flag << std::endl;
    // std::cout << tmp.fsize << std::endl;
    // std::cout << tmp.atime << std::endl;
    // std::cout << tmp.mtime << std::endl;
    // std::cout << tmp.real_path << std::endl;
    // std::cout << tmp.pack_path << std::endl;
    // std::cout << tmp.url_path << std::endl;
}
cloud::DataManager *_data;
void HotTest()
{
   _data = new cloud::DataManager();
   cloud::HotManager hm;
   hm.RunModule();
}

void ServiceTest()
{
    _data = new cloud::DataManager();
    cloud::Service service;
    service.RunModule();
}
int main(int argc, char *argv[])
{
    // FileUtilTest(argv[1]);
    // JsonUtilTest();
    // ConfigTest();
    //DataTest(argv[1]);
    //HotTest();
    // ServiceTest();

    //创建线程
    std::thread thread_service(ServiceTest);
    std::thread thread_hot(HotTest);
    
    //等待线程
    thread_service.join();
    thread_hot.join();

    return 0;
}